﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace ServiceBase
{
    /// <summary>
    /// 将图片简化颜色数量
    /// </summary>
    public class SimpleColor
    {
        #region 图像一值化
        /// <summary>
        /// 图像进行灰度处理
        /// </summary>
        /// <param name="bmp"></param>
        public static void OneColor_Gray(Bitmap bmp)
        {
            for (int i = 0; i < bmp.Height; i++)
            {
                for (int j = 0; j < bmp.Width; j++)
                {
                    Color c = bmp.GetPixel(j, i);
                    int grayValue = (c.R * 19595 + c.G * 38469 + c.B * 7472) >> 16;
                    bmp.SetPixel(j, i, Color.FromArgb(grayValue, grayValue, grayValue));
                }
            }
        } 
        #endregion

        #region 图像二值化
        /// <summary>
        /// 二值化，黑、白。
        /// B + G 小于 245
        /// </summary>
        /// <param name="map"></param>
        /// <returns></returns>
        public static void TwoColor1(Bitmap bmp)
        {
            for (int i = 0; i < bmp.Width; i++)
                for (int j = 0; j < bmp.Height; j++)
                {
                    Color color = bmp.GetPixel(i, j);
                    if ((color.B + color.G) < 245)
                    {
                        bmp.SetPixel(i, j, Color.Black);
                    }
                    else
                    {
                        bmp.SetPixel(i, j, Color.White);
                    }
                }
        }

        /// <summary>
        /// 二值化，黑、白。
        /// R 小于 50
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        public static void TwoColor2(Bitmap bmp)
        {
            for (int h = 0; h < bmp.Height; h++)
            {
                for (int w = 0; w < bmp.Width; w++)
                {
                    Color c = bmp.GetPixel(w, h);
                    if (c.R < 50)
                    {
                        bmp.SetPixel(w, h, Color.White);
                    }
                    else
                    {
                        bmp.SetPixel(w, h, Color.Black);
                    }
                }
            }
        }
        #endregion

        #region 图像三值化
        /// <summary>
        /// 图像三值简化算法
        /// 黑、白、蓝
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        public static void ThreeColor(Bitmap bmp)
        {
            for (int h = 0; h < bmp.Height; h++)
            {
                for (int w = 0; w < bmp.Width; w++)
                {
                    Color c = bmp.GetPixel(w, h);
                    int num = (int)((float)(float)c.R * 0.3 + (float)(float)c.G * 0.6 + (float)(float)c.B * 0.1);
                    if (num > 200)
                    {
                        bmp.SetPixel(w, h, Color.White);
                    }
                    if (IsAnyColor.IsBlack(c))
                    {
                        bmp.SetPixel(w, h, Color.Black);
                    }
                    else
                    {
                        if (IsAnyColor.IsBlue(c))
                        {
                            bmp.SetPixel(w, h, Color.Blue);
                        }
                        else
                        {
                            bmp.SetPixel(w, h, Color.White);
                        }
                    }
                }
            }
        } 
        #endregion

        #region 图像五值化
        /// <summary>
        /// 图像五值化简化方法
        /// 黑、白、灰、蓝、黄
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        public static void FiveColor(Bitmap bmp)
        {
            for (int h = 0; h < bmp.Height; h++)
            {
                for (int w = 0; w < bmp.Width; w++)
                {
                    Color c = bmp.GetPixel(w, h);
                    //黄色 =(红色+绿色)/ 2,取值0..255
                    int yellow = (int)(((float)c.R + (float)c.G) / 2);
                    //灰度 =(黄色+蓝色)/ 2,取值0..255
                    int gray = (int)((yellow + (float)c.B) / 2);
                    //将黄色和蓝色都大于187的视同白色
                    if (yellow > 187 && c.B > 187)
                    {
                        bmp.SetPixel(w, h, Color.White);
                        continue;
                    }
                    //将黄色和蓝色都小于153的视同黑色;
                    if (yellow < 153 && c.B < 153)
                    {
                        bmp.SetPixel(w, h, Color.Black);
                        continue;
                    }

                    if (yellow < 0.9 * (float)c.B)//如果黄色＜0.9×蓝色，则需进一步进行蓝色细分
                    {
                        if (yellow < 0.8 * (float)c.B)//如果黄色＜0.8×蓝色，视同蓝色
                        {
                            bmp.SetPixel(w, h, Color.Blue);
                            continue;
                        }
                        else if (gray < 187)//如果灰度＜187，视同蓝色
                        {
                            bmp.SetPixel(w, h, Color.Blue);
                            continue;
                        }
                        else
                        {
                            bmp.SetPixel(w, h, Color.Gray);
                            continue;
                        }
                    }
                    else if ((float)c.B < 0.9 * yellow)//如果蓝色＜0.9×黄色，则需进一步进行黄色细分
                    {
                        if ((float)c.B < 0.8 * yellow)//如果蓝色＜0.8×黄色，视同黄色
                        {
                            bmp.SetPixel(w, h, Color.Yellow);
                            continue;
                        }
                        else if (gray > 153)//如果灰度＞153，视同黄色
                        {
                            bmp.SetPixel(w, h, Color.Yellow);
                            continue;
                        }
                        else
                        {
                            bmp.SetPixel(w, h, Color.Gray);
                            continue;
                        }
                    }
                    else//否则则需进一步进行灰色细分
                    {
                        if (gray < 153)//如果灰度＜153，视同黑色
                        {
                            bmp.SetPixel(w, h, Color.Black);
                            continue;
                        }
                        else if (gray > 187)//如果灰度＞187，视同白色
                        {
                            bmp.SetPixel(w, h, Color.White);
                            continue;
                        }
                        else//否则视同灰色
                        {
                            bmp.SetPixel(w, h, Color.Gray);
                            continue;
                        }
                    }
                }
            }
        } 
        #endregion
    }
}
